/*
    created: 2023/4/1
    filename: BUilder.h
    author: 李东霖
    purpose: Builder模式的演示代码

*/

#ifndef _BUILDER_H_ 
#define _BUILDER_H_

//Builder虚基类，提供不同部分的构建接口函数
class Builder
{
public:
    Builder() = default;
    virtual ~Builder() = default; 

public:
    //提供构建不同部分的构建接口函数 也就是不同品牌的生产
    virtual void BuiderPartA() = 0;
    virtual void BuiderPartB() = 0;

};

//使用Builder构建产品，构建产品的过程是一样的，但是不同的Builder派生类由不同的实现
//这个不同的实现通过不同的派生类来实现，存在一个Builder的基类指针，来实现多态调用  
class Director
{
public:
    //传入一个Builder基类指针来构造Director
    Director(Builder* pBuilder);
    ~Director();

    //提供一个构建产品的方法 
    void Construct();
    
private:
    Builder* m_pBuilder;
};

//Builder的派生类，类似于品牌1，实现BuiderPartA，BuiderPartA接口函数  
class ConcreateBuilder1:public Builder
{
public: 
    ConcreateBuilder1() = default;
    virtual ~ConcreateBuilder1(){}

    //实现基类的接口
    virtual void BuiderPartA() override;
    virtual void BuiderPartB() override;   
};

//Builder的派生类，类似于品牌2，实现BuiderPartA，BuiderPartA接口函数  
class ConcreateBuilder2:public Builder
{
public: 
    ConcreateBuilder2() = default;
    virtual ~ConcreateBuilder2(){}

    //实现基类的接口
    virtual void BuiderPartA() override;
    virtual void BuiderPartB() override;   
};

#endif //!_BUILDER_H_







